package com.apes.fn.scm.retailOrder.service.tc.vipSurplus;

import com.alibaba.fastjson.JSONArray;
import com.apes.fn.scm.retailOrder.service.tc.commission.EmployeeCommissionDao;
import com.apes.fn.scm.retailOrder.service.tc.commission.EmployeeCommissionService;
import com.apes.framework.api.DomainService;
import com.apes.framework.plugin.esb.api.SimpleRequest;
import com.apestech.framework.json.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Title: VipSurplusService
 * @Description: 跨公司会员余额结算明细
 * @author: ZhengZeXian
 * @create: 2021/8/27 9:48
 */
@Service("vipSurplusSettleService")
public class VipSurplusSettleService extends DomainService {

    protected static Log logger = LogFactory.getLog(VipSurplusSettleService.class);

    @Autowired
    private VipSurplusDao dao;
    @Autowired
    private EmployeeCommissionService es;
    @Autowired
    private EmployeeCommissionDao edao;

    /**
     * 老框架跨公司会员余额结算明细_收款_商品 （总入口）
     */
    public void execOldVipSurplus(SimpleRequest request){
        JSONObject param = new JSONObject();
        param.put("DATE_START",request.getMap().get("DATE_START"));
        param.put("DATE_END",request.getMap().get("DATE_END"));
        execOldSk(param);
        execOldSp(param);
    }

    /**
     * 新系统跨公司会员余额结算明细_收款_商品 （总入口）
     */
    public void execNewVipSurplus(SimpleRequest request){
        JSONObject param = new JSONObject();
        param.put("ID",request.getMap().get("ID"));
        execNewSk(param);
        execNewSp(param);
    }

    /**
     * 老框架跨公司会员余额结算明细-收款
     */
    public void execOldSk (JSONObject param){

        logger.info("开始查询老系统零售单循环收款>>>>>>>>>>>>>>>>>>>");
        List<Map> maps = dao.queryOldVipSk(param);

        maps.stream().forEach(map -> {
            JSONObject jsonObject = new JSONObject(map);

            logger.info("第一步：获取公司所属接入商");
            map.put("GS_ACCESS",dao.queryOldVipGsAccess(jsonObject));

            logger.info("第二步：获取所属公司所属接入商");
            map.put("SSGS_ACCESS",dao.queryOldVipSsgsAccess(jsonObject));

            logger.info("第三步：判断公司所属接入商是否等于所属公司所属接入商");
            if (map.get("GS_ACCESS").equals(map.get("SSGS_ACCESS"))) return;

            logger.info("第四步：判断是否要计算提成");
            if (!dao.existVipSurplusSk(jsonObject).getJSONObject(0).get("CZBJ").toString().equals("0")) return;

            logger.info("第五步：取VIP_SURPLUS跨公司会员结算策略");
            JSONObject VIP_SURPLUS = es.getStrategy(map, "VIP_SURPLUS");
            /** 无取到VIP_SURPLUS跨公司会员结算策略 不执行后面的操作 */
            if (VIP_SURPLUS.get("sys_break") == null ? false : VIP_SURPLUS.get("sys_break").equals("1")){
                logger.info("第五步：未取到VIP_SURPLUS跨公司会员结算策略即将退出！！！");
                return;
            }

            map.putAll(VIP_SURPLUS);

            logger.info("第六步：计算结算金额");
            map.put("JSJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SK_JSJE,map));

            jsonObject = new JSONObject(map);

            logger.info("执行写入跨公司会员余额结算明细-收款" + jsonObject.toString());
            dao.insertVipSurplusSk(jsonObject);
        });
    }

    /**
     * 老框架跨公司会员余额结算明细-商品
     */
    public void execOldSp (JSONObject param){

        logger.info("开始查询老系统零售单循环商品>>>>>>>>>>>>>>>>>>>");
        List<Map> maps = dao.queryOldVipSp(param);

        maps.stream().forEach(map -> {
            JSONObject jsonObject = new JSONObject(map);

            logger.info("第一步：获取公司所属接入商");
            map.put("GS_ACCESS",dao.queryOldVipGsAccess(jsonObject));

            logger.info("第二步：获取所属公司所属接入商");
            map.put("SSGS_ACCESS",dao.queryOldVipSsgsAccess(jsonObject));

            logger.info("第三步：判断公司所属接入商是否等于所属公司所属接入商");
            if (map.get("GS_ACCESS").equals(map.get("SSGS_ACCESS"))) return;

            logger.info("第四步：判断是否要计算提成");
            if (!dao.existVipSurplusSp(jsonObject).getJSONObject(0).get("CZBJ").toString().equals("0")) return;

            logger.info("第五步：判断是否要原抵扣类型");
            if (map.get("DJLXID").equals("XT1")){
                JSONArray array = dao.queryOldVipSpYdklx(jsonObject);
                if(array.size() == 0){
                    map.put("YDKLX",null);
                }else {
                    map.put("YDKLX",array.getJSONObject(0).getBigDecimal("YDKLX"));
                }
            }

            logger.info("第六步：计算抵扣类型");
            map.put("DKLX",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_DKLX,map));

            logger.info("第七步：取VIP_SURPLUS_SP跨公司会员结算策略_商品");
            JSONObject VIP_SURPLUS_SP = es.getStrategy(map, "VIP_SURPLUS_SP");
            //未取到策略给默认值0
//            edao.checkField(VIP_SURPLUS_SP,"T001");

            logger.info("第八步：取VIP_SURPLUS_PL取跨公司会员结算策略_品类");
            JSONObject VIP_SURPLUS_PL = es.getStrategy(map, "VIP_SURPLUS_PL");
            //未取到策略给默认值0
            edao.checkField(VIP_SURPLUS_PL,"T002","T003");

            logger.info("第九步：取VIP_SURPLUS跨公司会员结算策略");
            JSONObject VIP_SURPLUS = es.getStrategy(map, "VIP_SURPLUS");
            /** 无取到VIP_SURPLUS跨公司会员结算策略 不执行后面的操作 */
            if (VIP_SURPLUS.get("sys_break") == null ? false : VIP_SURPLUS.get("sys_break").equals("1")){
                logger.info("第九步：未取到VIP_SURPLUS跨公司会员结算策略即将退出！！！");
                return;
            }

            map.putAll(VIP_SURPLUS_SP);
            map.putAll(VIP_SURPLUS_PL);
            map.putAll(VIP_SURPLUS);

            logger.info("第十步：计算红包抵扣金额");
            map.put("BBDKJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_BBDKJE,map));
            map.put("DKJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_DKJE,map));

            logger.info("第十一步：计算返现抵扣金额");
            map.put("FXJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_FXJE,map));

            logger.info("第十二步：计算抵扣结算金额");
            map.put("BBJSJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_BBJSJE,map));
            map.put("DKJSJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_DKJSJE,map));

            logger.info("第十三步：计算返现抵扣结算金额");
            map.put("FXJSJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_FXJSJE,map));

            logger.info("第十四步：计算兑换券结算金额");
            map.put("DHQJSJE",es.execExpress(VipSurplusFormula.OLD_VIP_SURPLUS_SP_DHQJSJE,map));

            jsonObject = new JSONObject(map);

            logger.info("执行写入跨公司会员余额结算明细-商品" + jsonObject.toString());
            dao.insertVipSurplusSp(jsonObject);
        });
    }

    /**
     * 新框架公司会员余额结算明细-收款
     */
    public void execNewSk (JSONObject param){

        logger.info("开始查询新系统零售单循环收款>>>>>>>>>>>>>>>>>>>");
        List<Map> maps = dao.queryNewVipSk(param);

        maps.stream().forEach(map -> {
            JSONObject jsonObject = new JSONObject(map);

//            logger.info("第一步：获取公司所属接入商");
//            map.put("GS_ACCESS",checkField(dao.queryOldVipGsAccess(jsonObject),"GS_ACCESS"));

//            logger.info("第二步：获取所属公司所属接入商");
//            map.put("SSGS_ACCESS",checkField(dao.queryOldVipSsgsAccess(jsonObject),"SSGS_ACCESS"));

            logger.info("第三步：判断消费公司是否和所属公司是同公司");
            if (map.get("GSID").equals(map.get("SSGSID"))) return;

            logger.info("第四步：判断是否要计算提成");
            if (!dao.existVipSurplusSk(jsonObject).getJSONObject(0).get("CZBJ").toString().equals("0")) return;

            logger.info("第五步：取VIP_SURPLUS跨公司会员结算策略");
            JSONObject VIP_SURPLUS = es.getStrategy(map, "VIP_SURPLUS");
            /** 无取到VIP_SURPLUS跨公司会员结算策略 不执行后面的操作 */
            if (VIP_SURPLUS.get("sys_break") == null ? false : VIP_SURPLUS.get("sys_break").equals("1")){
                logger.info("第五步：未取到VIP_SURPLUS跨公司会员结算策略即将退出！！！");
                return;
            }

            map.putAll(VIP_SURPLUS);

            logger.info("第六步：计算结算金额");
            map.put("JSJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SK_JSJE,map));

            jsonObject = new JSONObject(map);

            logger.info("执行写入跨公司会员余额结算明细-收款" + jsonObject.toString());
            dao.insertVipSurplusSk(jsonObject);
        });
    }

    /**
     * 新框架跨公司会员余额结算明细-商品
     */
    public void execNewSp (JSONObject param){

        logger.info("开始查询新系统零售单循环商品>>>>>>>>>>>>>>>>>>>");
        List<Map> maps = dao.queryNewVipSp(param);

        maps.stream().forEach(map -> {
            JSONObject jsonObject = new JSONObject(map);

//            logger.info("第一步：获取公司所属接入商");
//            map.put("GS_ACCESS",checkField(dao.queryOldVipGsAccess(jsonObject),"GS_ACCESS"));

//            logger.info("第二步：获取所属公司所属接入商");
//            map.put("SSGS_ACCESS",checkField(dao.queryOldVipSsgsAccess(jsonObject),"SSGS_ACCESS"));

            logger.info("第三步：判断消费公司是否和所属公司是同公司");
            if (map.get("GSID").equals(map.get("SSGSID"))) return;

            logger.info("第四步：判断是否要计算提成");
            if (!dao.existVipSurplusSp(jsonObject).getJSONObject(0).get("CZBJ").toString().equals("0")) return;

            logger.info("第五步：判断是否要原抵扣类型");
            if (map.get("DJLXID").equals("retailReturn")){
                JSONArray array = dao.queryNewVipSpYdklx(jsonObject);
                if(array.size() == 0){
                    map.put("YDKLX",null);
                }else {
                    map.put("YDKLX",array.getJSONObject(0).getBigDecimal("YDKLX"));
                }
            }

            logger.info("第六步：计算抵扣类型");
            map.put("DKLX",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_DKLX,map));

            logger.info("第七步：取VIP_SURPLUS_SP跨公司会员结算策略_商品");
            JSONObject VIP_SURPLUS_SP = es.getStrategy(map, "VIP_SURPLUS_SP");
//            //未取到策略给默认值0
//            edao.checkField(VIP_SURPLUS_SP,"T001");

            logger.info("第八步：取VIP_SURPLUS_PL取跨公司会员结算策略_品类");
            JSONObject VIP_SURPLUS_PL = es.getStrategy(map, "VIP_SURPLUS_PL");
            //未取到策略给默认值0
            edao.checkField(VIP_SURPLUS_PL,"T002","T003");

            logger.info("第九步：取VIP_SURPLUS跨公司会员结算策略");
            JSONObject VIP_SURPLUS = es.getStrategy(map, "VIP_SURPLUS");
            /** 无取到VIP_SURPLUS跨公司会员结算策略 不执行后面的操作 */
            if (VIP_SURPLUS.get("sys_break") == null ? false : VIP_SURPLUS.get("sys_break").equals("1")){
                logger.info("第九步：未取到VIP_SURPLUS跨公司会员结算策略即将退出！！！");
                return;
            }

            map.putAll(VIP_SURPLUS_SP);
            map.putAll(VIP_SURPLUS_PL);
            map.putAll(VIP_SURPLUS);

            logger.info("第十步：计算红包抵扣金额");
            map.put("BBDKJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_BBDKJE,map));
            map.put("DKJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_DKJE,map));

            logger.info("第十一步：计算返现抵扣金额");
            map.put("FXJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_FXJE,map));

            logger.info("第十二步：计算保呗红包结算金额和保呗红包应结税额");
            map.put("BBJSJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_BBJSJE,map));
            map.put("BBHBYJSE",es.execExpress("return (BBJSJE / (1 + TAX_AMT)) * TAX_AMT",map));

            logger.info("第十三步：计算红包结算金额和红包应结税额");
            map.put("DKJSJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_DKJSJE,map));
            map.put("HBYJSE",es.execExpress("return (DKJSJE / (1 + TAX_AMT)) * TAX_AMT",map));

            logger.info("第十四步：计算返现抵扣结算金额");
            map.put("FXJSJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_FXJSJE,map));

            logger.info("第十五步：计算兑换券结算金额");
            map.put("DHQJSJE",es.execExpress(VipSurplusFormula.NEW_VIP_SURPLUS_SP_DHQJSJE,map));

            jsonObject = new JSONObject(map);

            logger.info("执行写入跨公司会员余额结算明细-商品" + jsonObject.toString());
            dao.insertVipSurplusSp(jsonObject);
        });
    }

    /**
     * 根据列名获取对应字段的值为空给
     */
    public String checkField(JSONArray array, String column){
        if (array.isEmpty() && array.size() == 0) return null;
        return array.getJSONObject(0).getString(column);
    }
}
